home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume5 / faces-1.3 / part02 < prev    next >
Encoding:
Text File  |  1989-02-03  |  37.5 KB  |  1,310 lines

  1. Path: xanth!ames!mailrus!cornell!batcomputer!itsgw!steinmetz!uunet!munnari!basser!root
  2. From: richb@sunchat.oz.AU (Rich Burridge)
  3. Newsgroups: comp.sources.misc
  4. Subject: v05i093: faces v1.3 - visual mail/print monitor, Part 2/3
  5. Message-ID: <1703@basser.oz>
  6. Date: 24 Dec 88 02:14:09 GMT
  7. Sender: root@basser.oz
  8. Organization: Sun Microsystems, Sydney
  9. Lines: 1298
  10. Approved: john@cs.su.oz.AU
  11.  
  12. Posting-number: Volume 5, Issue 93
  13. Submitted-By: Rich Burridge <richb@sunchat.oz.AU>
  14. Archive-name: faces-1.3/part02
  15.  
  16. ------CUT HERE------CUT HERE------
  17. #! /bin/sh
  18. # this is a shell archive, meaning:
  19. # 1. Remove everything above the #! /bin/sh line
  20. # 2. Save the resulting text in a file.
  21. # 3. Execute the file with /bin/sh to create the files:
  22. #    mon.c
  23. #    news.c
  24. #    rec.c
  25. #    sunview.c
  26. # This archive created: Sun Dec 11 14:57:25 EST 1988
  27. #
  28. #
  29. export PATH; PATH=/bin:$PATH
  30. #
  31. if [ -f mon.c ]
  32. then
  33. echo shar: will not over-write existing file mon.c
  34. else
  35. echo shar: extracting 'mon.c',     8937 characters
  36. cat > mon.c <<'Funky_Stuff'
  37. /*LINTLIBRARY*/
  38. #ifndef lint
  39. static char sccsid[] = "@(#)mon.c 1.4 88/12/11" ;
  40. #endif
  41.  
  42. /*  Monitoring routines used by the faces program.
  43.  * 
  44.  *  Copyright (c) Rich Burridge - Sun Microsystems Australia.
  45.  *                                All rights reserved.
  46.  *
  47.  *  Permission is given to distribute these sources, as long as the
  48.  *  copyright messages are not removed, and no monies are exchanged. 
  49.  * 
  50.  *  No responsibility is taken for any errors on inaccuracies inherent
  51.  *  either to the comments or the code of this program, but if reported
  52.  *  to me, then an attempt will be made to fix them.
  53.  */
  54.  
  55. #include "faces.h"
  56. #include "extern.h"
  57.  
  58. adjust()          /* Adjust the row and column position. */
  59. {
  60.   struct psinfo *this ;
  61.  
  62.   if (mtype != MONNEW)
  63.     {
  64.       if (++column == NO_PER_ROW)
  65.         {
  66.           column = 0 ;
  67.           row++ ;
  68.         }
  69.       return ;
  70.     }
  71.   if (psrecs != NULL)           /* Adjust animation positions for MONNEW */
  72.     {
  73.       this = psrecs ;           /* Point to beginning of chain. */
  74.       while (this != NULL)
  75.         {
  76.           this->column++ ;      /* Adjust column position. */
  77.           if (facetype == NEWSTYPE && this->next == NULL)
  78.             this->column-- ;    /* Reset for brand new animate record. */
  79.           this = this->next ;
  80.         }
  81.     }
  82. }
  83.  
  84.  
  85. do_check()        /* Perform another check of the appropriate type. */
  86. {
  87.   switch ((int) mtype)
  88.     {
  89.       case MONALL     : do_mail(MONALL) ;  /* Monitor all of the mail file. */
  90.                         break ;
  91.       case MONNEW     : do_mail(MONNEW) ;  /* Monitor new mail only. */
  92.                         break ;
  93.       case MONPRINTER : do_printer() ;     /* Monitor the print queue. */
  94.                         break ;
  95.     }
  96.   firsttime = 0 ;
  97. }
  98.  
  99.  
  100. do_mail(mtype)              /* Monitor a mail file for new or all mail. */
  101. enum mon_type mtype ;
  102. {        
  103.   char host[MAXLINE] ;      /* Pointer to host name from the "From" line. */
  104.   char *ptr ;               /* Pointer to extract field. */
  105.   char realname[MAXLINE] ;  /* Real username for this user. */
  106.   char ts[MAXLINE] ;        /* Pointer to time stamp from the "From" line. */
  107.   char user[MAXLINE] ;      /* Pointer to user name from the "From" line. */
  108.   FILE *fp ;                /* File descriptor for users mail spool file. */
  109.   struct recinfo *crec ;    /* Pointer to current mail record for updating. */
  110.  
  111.   column = row = 0 ;        /* Start in top left corner of pixrect. */
  112.   newmail = 0 ;             /* Assume no new mail. */
  113.   noicons = 0 ;
  114.  
  115.   if (mtype == MONNEW) make_pixrect(NO_PER_ROW) ;
  116.   if (stat(spoolfile,&buf) == -1)
  117.     {
  118.       lastsize = 0 ;
  119.       if (mtype == MONNEW) show_display() ;   /* Show new mail. */
  120.       else make_display() ;     /* Output icons and tidyup chain of records. */
  121.       return ;
  122.     }
  123.   if (buf.st_size > lastsize) newmail = 1 ;   /* New mail found. */
  124.   if (mtype == MONNEW)
  125.     if (buf.st_size <= lastsize)   /* Is the size of mail folder bigger? */
  126.       {
  127.         lastsize = buf.st_size ;   /* No: save new size and exit. */
  128.         show_display() ;
  129.         return ;
  130.       }
  131.  
  132.   if ((fp = fopen(spoolfile,"r")) == NULL)     /* Open spoolfile. */
  133.     {
  134.       if (mtype == MONNEW) show_display() ;   /* Show new mail. */
  135.       else make_display() ;     /* Output icons and tidyup chain of records. */
  136.       return ;
  137.     }
  138.   if (mtype == MONNEW) FSEEK(fp, lastsize, 0) ;
  139.   lastsize = buf.st_size ;
  140.   while (fgets(nextline,MAXLINE,fp) != NULL)
  141.     if (EQUAL(nextline,"From "))
  142.       {
  143.         host[0] = user[0] = ts[0] = '\0' ;
  144.  
  145.         if ((ptr = get_field(HOSTNAME,nextline)) != NULL)
  146.           STRCPY(host, ptr) ;
  147.         if ((ptr = get_field(USERNAME,nextline)) != NULL)
  148.           STRCPY(user, ptr) ;
  149.         if ((ptr = get_field(TIMESTAMP,nextline)) != NULL)
  150.           STRCPY(ts, ptr) ;
  151.  
  152.         h_to_c(host, community) ;    /* Turn hostname into community name. */
  153.         a_to_u(community, user, realname) ;
  154.         make_iconname(community, realname) ;
  155.         if (mtype == MONNEW)
  156.           {
  157.             add_face(BOTH, ORDINARY, iconname) ;
  158.             if (!dontshowtime) text(ICON, LEFT, ts) ;
  159.             if (!dontshowuser) text(WINDOW, LEFT, realname) ;
  160.             adjust() ;
  161.           }
  162.         else
  163.           {
  164.             if ((crec = rec_exists(community, realname)) != NULL)
  165.               {
  166.                 STRCPY(crec->ts, ts) ;
  167.                 if (!crec->total) noicons++ ;
  168.                 crec->total++ ;
  169.               }
  170.             else add_record(community, realname, ts, 0) ;
  171.           }
  172.       }
  173.   FCLOSE(fp) ;
  174.   if (mtype == MONNEW) show_display() ;   /* Show new mail. */
  175.   else make_display() ;     /* Output icons and tidyup chain of records. */
  176. }
  177.  
  178.  
  179. do_printer()                 /* Monitor printer queue. */
  180. {
  181.   struct recinfo *this, *next ;
  182.   FILE *fp ;                 /* File descriptor for users mail spool file. */
  183.   char command[MAXLINE] ;    /* Lpq system call for this printer. */
  184.   char owner[MAXLINE] ;      /* Owner of job in the print queue. */
  185.   char tempname[MAXLINE] ;   /* Temporary unique filename. */
  186.   int size ;                 /* Size of this print job in bytes. */
  187.  
  188.   noicons = 0 ;
  189.   SPRINTF(tempname,"/tmp/faces%04d",getpid()) ;
  190.   SPRINTF(command,"lpq -P %s > %s",printer,tempname) ;
  191.   if (system(command))
  192.     {
  193.       FPRINTF(stderr,"%s: system call for printer %s stats failed.\n",
  194.               progname,printer) ;
  195.       return ;
  196.     }
  197.   if ((fp = fopen(tempname,"r")) == NULL)     /* Open spoolfile. */
  198.     {
  199.       FPRINTF(stderr,"%s: couldn't open printer stats in %s.\n",
  200.               progname,tempname) ;
  201.       return ;
  202.     }
  203.   column = row = 0 ;          /* Start in top left corner of pixrect. */
  204.   FGETS(nextline,MAXLINE,fp) ;
  205.   if (EQUAL(nextline,"no entries"))
  206.     {
  207.       make_pixrect(1) ;               /* Just the "no print" icon. */
  208.       add_face(BOTH, NOPRINT, "") ;   /* Set to "no print" icon. */
  209.     }
  210.   else if (EQUAL(nextline,"Printer Error: may need attention!"))
  211.     {
  212.       make_pixrect(1) ;               /* Just the "no paper" icon. */
  213.       add_face(BOTH, NOPAPER, "") ;   /* Set to "no paper" icon. */
  214.       text(BOTH, LEFT, printer) ;     /* Output printer name. */
  215.     }
  216.   else
  217.     {
  218.       FGETS(nextline,MAXLINE,fp) ;    /* Skip the next line. */
  219.       while (fgets(nextline,MAXLINE,fp) != NULL)
  220.         {
  221.           SSCANF(&nextline[7], "%s", owner) ;
  222.           SSCANF(&nextline[60], "%d", &size) ;
  223.           h_to_c("", community) ;
  224.           make_iconname(community, owner) ;
  225.           add_record("",owner,"",size) ;
  226.         }
  227.       make_pixrect(noicons) ;
  228.       this = recs ;
  229.       while (this != NULL)
  230.         {
  231.           next = this->next ;
  232.           add_face(WINDOW, ORDINARY, this->iconname) ;
  233.           SPRINTF(nextline, "%1d", this->size) ;
  234.           if (!dontshowuser)
  235.             text(WINDOW, LEFT, this->username) ;  /* Owner. */
  236.           text(WINDOW, RIGHT, nextline) ;         /* Size. */
  237.           if (this == recs)
  238.             {
  239.               add_face(ICON, ORDINARY, this->iconname) ;
  240.               SPRINTF(nextline, "%1d %s", noicons, (noicons == 1 ? "job" : "jobs")) ;
  241.               text(ICON, RIGHT, nextline) ;   /* Number of jobs. */
  242.             }
  243.           adjust() ;    /* Adjust column and row. */
  244.           remove_record(this) ;
  245.           this = next ;
  246.         }
  247.       recs = last = NULL ;
  248.     }
  249.   FCLOSE(fp) ;
  250.   UNLINK(tempname) ;
  251.   show_display() ;
  252. }
  253.  
  254.  
  255. make_pixrect(count)   /* Make window pixrect the correct size. */
  256. int count ;
  257. {
  258.   int c, r ;          /* Size in columns and rows of window display. */
  259.  
  260.   r = ((count-1) / NO_PER_ROW) + 1 ;   /* Number of rows of faces. */
  261.   c = NO_PER_ROW ;                     /* Full width display. */
  262.   if (count <= 10)
  263.     {
  264.       r = 1 ;         /* One row. */
  265.       c = count ;     /* Of 'count' columns. */
  266.     }
  267.  
  268.   height = r * ICONHEIGHT ;    /* Height of the icon display. */
  269.   width = c * ICONWIDTH ;      /* Width of the icon display. */
  270.   create_pixrects(width, height) ;
  271. }
  272.  
  273.  
  274. make_display()              /* Output icons and tidyup chain of records. */
  275. {
  276.   int count ;               /* Name of faces in icon display. */
  277.   struct recinfo *this, *next ;
  278.  
  279.   count = noicons ;         /* Number of faces to display. */
  280.   if (!count) count = 1 ;   /* Always one "no mail" icon. */
  281.   make_pixrect(count) ;
  282.  
  283.   if (!noicons) add_face(BOTH, NOMAIL, "") ;
  284.   else
  285.     {
  286.       this = recs ;
  287.       while (this != NULL)
  288.         {
  289.           next = this->next ;
  290.           add_face(BOTH, ORDINARY, this->iconname) ;
  291.           if (!dontshowno)
  292.             {
  293.               SPRINTF(nextline, "%1d", this->total) ;
  294.               text(ICON, RIGHT, nextline) ;
  295.             }
  296.           if (!dontshowtime) text(ICON, LEFT, this->ts) ;
  297.           if (!dontshowuser) text(WINDOW, LEFT, this->username) ;
  298.           adjust() ;
  299.           remove_record(this) ;
  300.           this = next ;
  301.         }
  302.       recs = last = NULL ;
  303.     }
  304.   show_display() ;         /* Display the latest set of faces. */
  305. }
  306. Funky_Stuff
  307. len=`wc -c < mon.c`
  308. if [ $len !=     8937 ] ; then
  309. echo error: mon.c was $len bytes long, should have been     8937
  310. fi
  311. fi # end of overwriting check
  312. if [ -f news.c ]
  313. then
  314. echo shar: will not over-write existing file news.c
  315. else
  316. echo shar: extracting 'news.c',    10648 characters
  317. cat > news.c <<'Funky_Stuff'
  318. /*LINTLIBRARY*/
  319. #ifndef lint
  320. static char sccsid[] = "@(#)news.c 1.3 88/12/11" ;
  321. #endif
  322.  
  323. /*  NeWS dependent graphics routines used by faces,
  324.  *  the visual mail and print job monitor.
  325.  * 
  326.  *  Copyright (c) Rich Burridge - Sun Microsystems Australia.
  327.  *                                All rights reserved.
  328.  *
  329.  *  Permission is given to distribute these sources, as long as the
  330.  *  copyright messages are not removed, and no monies are exchanged. 
  331.  * 
  332.  *  No responsibility is taken for any errors on inaccuracies inherent
  333.  *  either to the comments or the code of this program, but if reported
  334.  *  to me, then an attempt will be made to fix them.
  335.  */
  336.  
  337. #include "faces.h"
  338. #include "extern.h"
  339. #include <sundev/kbd.h>
  340. #include <sundev/kbio.h>
  341.  
  342. #ifdef SUNOS3.x
  343. int fullmask ;               /* Full mask of file descriptors to check on. */
  344. int readmask ;               /* Readmask used in select call. */
  345. #else
  346. fd_set fullmask ;            /* Full mask of file descriptors to check on. */
  347. fd_set readmask ;            /* Readmask used in select call. */
  348. #endif SUNOS3.x
  349.  
  350. int kbdfd ;                  /* File descriptor for the keyboard. */
  351. int psfd ;                   /* NeWS connection file descriptor. */
  352. unsigned short ibuf[256] ;   /* Ikon/icon image buffer. */
  353.  
  354. extern FILE *PostScript ;
  355. extern FILE *PostScriptInput ;
  356.  
  357.  
  358. add_face(display, itype, name)     /* Add this icon to the display. */
  359. enum disp_type display ;
  360. enum icon_type itype ;
  361. char *name ;
  362. {
  363.   char face[MAXLINE] ;        /* Canvas containing face (Source). */
  364.  
  365.   switch ((int) itype)
  366.     {
  367.       case NOMAIL   : STRCPY(face, "NomailIcon") ;
  368.                       break ;
  369.       case NOPAPER  : STRCPY(face, "NopaperIcon") ;
  370.                       break ;
  371.       case NOPRINT  : STRCPY(face, "NoprintIcon") ;
  372.                       break ;
  373.       case ORDINARY : if ((facetype = get_icon(name, ibuf)) != -1) 
  374.                         switch (facetype)
  375.                           {
  376.                             case BLITTYPE :
  377.                             case SUNTYPE  : load_icon("Curface") ;
  378.                                             STRCPY(face, "CurfaceIcon") ;
  379.                             case NEWSTYPE : break ;
  380.                           }
  381.                       else STRCPY(face, "NofaceIcon") ;
  382.                       break ;
  383.     }
  384.  
  385.   if (display == ICON)
  386.     if (mtype == MONPRINTER) adjust_image("MPR", face, 0, 0) ;
  387.     else adjust_image("MPR", face, row, column) ;
  388.   else if (display == WINDOW) adjust_image("PR", face, row, column) ;
  389.   else
  390.     {
  391.       adjust_image("MPR", face, row, column) ;
  392.       adjust_image("PR", face, row, column) ;
  393.     }
  394.   FFLUSH(PostScript) ;
  395. }
  396.  
  397.  
  398. adjust_image(dest, face, row, column)
  399. char *dest, *face ;
  400. int row, column ;
  401. {
  402.   switch ((int) mtype)
  403.     {
  404.       case MONNEW     : FPRINTF(PostScript, "%d 0 %d %d %s ShiftImage\n",
  405.                                 ICONWIDTH, (NO_PER_ROW-1)*ICONWIDTH, ICONHEIGHT,
  406.                                 dest) ;
  407.                         if (facetype == NEWSTYPE)
  408.                           {
  409.                             FPRINTF(PostScript, "%d %d %d %d %s ClearBox\n",
  410.                                     column*ICONWIDTH, row*ICONHEIGHT,
  411.                                     ICONWIDTH, ICONHEIGHT, dest) ;
  412.                             return ;
  413.                           }
  414.       case MONALL     :
  415.       case MONPRINTER : FPRINTF(PostScript,"%s %d %d %d %d %s MoveImage\n",
  416.                                 face, ICONWIDTH, ICONHEIGHT,
  417.                                 column*ICONWIDTH, row*ICONHEIGHT, dest) ;
  418.     }
  419. }
  420.  
  421.  
  422. beep_flash(beeps, flashes)    /* Perform visual feedback. */
  423. int beeps, flashes ;
  424. {
  425.   int i, x ;
  426.  
  427.   if (beeps)
  428.     for (i = 0; i < beeps; i++)
  429.       {
  430.         x = KBD_CMD_BELL ;
  431.         IOCTL(kbdfd, KIOCCMD, &x) ;
  432.         usleep(250000) ;
  433.         x = KBD_CMD_NOBELL ;
  434.         IOCTL(kbdfd, KIOCCMD, &x) ;
  435.         usleep(250000) ;
  436.       }
  437. }
  438.  
  439.  
  440. create_pixrects(width, height)        /* Create pixrects for the face images. */
  441. {
  442.   int h, i, j, w ;
  443.  
  444.   if (mtype == MONNEW && !firsttime) return ;
  445.   FPRINTF(PostScript,"%d %d PR DoPixrects\n", width, height) ;
  446.   h = height ;
  447.   w = width ;
  448.   if (mtype == MONPRINTER)
  449.     {
  450.       h = ICONHEIGHT ;
  451.       w = ICONWIDTH ;
  452.     }
  453.   FPRINTF(PostScript,"%d %d MPR DoPixrects\n", w, h) ;
  454.   if (strlen(bgicon))
  455.     {
  456.       for (i = 0; i < (height / 64); i++)
  457.         for (j = 0; j < (width / 64); j++)
  458.           {
  459.             FPRINTF(PostScript,"BackgroundIcon %d %d %d %d PR MoveImage\n",
  460.                                   ICONWIDTH, ICONHEIGHT, j, i) ;
  461.             FPRINTF(PostScript,"BackgroundIcon %d %d %d %d MPR MoveImage\n",
  462.                                   ICONWIDTH, ICONHEIGHT, j, i) ;
  463.           }
  464.     }
  465.   else FPRINTF(PostScript,"SetBackground\n") ;
  466. }
  467.  
  468.  
  469. do_news_ps(psrecs)     /* Display chain of NeWS animations. */
  470. struct psinfo *psrecs ;
  471. {
  472.   struct psinfo *next, *this ;
  473.  
  474.   this = psrecs ;      /* Point to beginning of NeWS records. */
  475.   while (this != NULL)
  476.     {
  477.       next = this->next ;
  478.       if ((mtype != MONNEW) || (this->column < NO_PER_ROW))
  479.         {
  480.           FPRINTF(PostScript, "(%s) %d %d %d %d ExecFile\n",
  481.                   this->name, ICONWIDTH, ICONHEIGHT,
  482.                   this->column*ICONWIDTH, this->row*ICONHEIGHT) ;
  483.           FFLUSH(PostScript) ;
  484.         }
  485.       this = next ;
  486.     }
  487. }
  488.  
  489.  
  490. init_ws_type()
  491. {
  492.   if (ps_open_PostScript() < 0) return -1 ;
  493.   if (send_ps_file(NEWSFILE) == -1)
  494.     {
  495.       FPRINTF(stderr,"%s: cannot open %s\n", progname, NEWSFILE) ;
  496.       FCLOSE(PostScript) ;
  497.       return(-1) ;
  498.     }
  499.   FFLUSH(PostScript) ;
  500.   if (ferror(PostScript))
  501.     {
  502.       FCLOSE(PostScript) ;
  503.       return(-1) ;
  504.     }
  505.   if (invert) FPRINTF(PostScript, "/Invert false def\n") ;
  506.   else FPRINTF(PostScript, "/Invert true def\n") ;
  507.   gtype = NEWS ;
  508.   return(0) ;
  509. }
  510.  
  511.  
  512. load_icon(name)
  513. char *name ;
  514. {
  515.   int i, j ;
  516.  
  517.   FPRINTF(PostScript,"/%sIcon 64 64 1 { } { <\n", name) ;
  518.   for (i = 0; i < 32; i++)
  519.     {
  520.       for (j = 0; j < 8; j++) FPRINTF(PostScript,"%.4X ", ibuf[i*8+j]) ;
  521.       FPRINTF(PostScript,"\n") ;
  522.     }
  523.   FPRINTF(PostScript,"> } buildimage def\n") ;
  524. }
  525.  
  526.  
  527. /*ARGSUSED*/
  528. make_frame(argc,argv)
  529. int argc ;
  530. char *argv[] ;
  531. {
  532.   if ((kbdfd = open("/dev/kbd", 0)) == -1)
  533.     {
  534.       FPRINTF(stderr,"%s: can't open keyboard.\n", progname) ;
  535.       exit(1) ;
  536.     }
  537.  
  538.   psfd = fileno(PostScriptInput) ;
  539.  
  540. #ifdef SUNOS3.x
  541.   fullmask = 1 << psfd ;
  542. #else
  543.   FD_ZERO(&fullmask) ;
  544.   FD_SET(psfd, &fullmask) ;
  545. #endif SUNOS3.x
  546.  
  547.   if (strlen(bgicon))
  548.     if (get_sun_icon(bgicon, ibuf) == 0) load_icon("Background") ;
  549.  
  550.   FPRINTF(PostScript,"%d %d %d %d %d %d %d MakeFrame\n",
  551.           wx, wy, NO_PER_ROW*ICONWIDTH+10, ICONHEIGHT*10+10,
  552.           ix, iy, iconic) ;
  553.   FPRINTF(PostScript,"InitFont\n") ;
  554.   width = NO_PER_ROW * ICONWIDTH ;
  555.   height = ICONHEIGHT ;
  556. }
  557.  
  558.  
  559. make_icon()
  560. {
  561.   if (get_sun_icon("noface.icon", ibuf) == 0) load_icon("Noface") ;
  562.   if (get_sun_icon("nomail.icon", ibuf) == 0) load_icon("Nomail") ;
  563.   if (get_sun_icon("nopaper.icon", ibuf) == 0) load_icon("Nopaper") ;
  564.   if (get_sun_icon("noprint.icon", ibuf) == 0) load_icon("Noprint") ;
  565. }
  566.  
  567.  
  568. send_ps_file(fname)
  569. char *fname ;
  570. {
  571.   FILE *stream ;
  572.   int c ;
  573.  
  574.   if ((stream = fopen(fname,"r")) == NULL) return -1 ;
  575.   while ((c = getc(stream)) != EOF) PUTC(c,PostScript) ;
  576.   FCLOSE(stream) ;
  577.   return 0 ;
  578. }
  579.  
  580.  
  581. show_display()        /* Show the latest set of mail icon faces. */
  582. {
  583.   if (mtype != MONPRINTER)
  584.     FPRINTF(PostScript,"%d %d %d %d ShowDisplay\n",
  585.                         width, height, width, height) ;
  586.   else FPRINTF(PostScript,"%d %d %d %d ShowDisplay\n",
  587.                         width, height, ICONWIDTH, ICONHEIGHT) ;
  588.  
  589.   if (newmail) beep_flash(beeps, flashes) ;
  590.   if (psrecs != NULL) do_news_ps(psrecs) ;
  591.   FFLUSH(PostScript) ;
  592. }
  593.  
  594.  
  595. start_tool()
  596. {
  597.   int type ;                     /* Value from NeWS server. */
  598.   struct psinfo *next, *this ;   /* For removing current chain of records. */
  599.   struct timeval tval ;
  600.  
  601.   tval.tv_usec = 0 ;
  602.   tval.tv_sec = period ;
  603.  
  604.   for (;;)
  605.     {
  606.       readmask = fullmask ;
  607. #ifdef SUNOS3.x
  608.       SELECT(32, &readmask, 0, 0, &tval) ;
  609.       if (readmask && (1 << psfd))
  610. #else
  611.       SELECT(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0, &tval) ;
  612.       if (FD_ISSET(psfd, &readmask))
  613. #endif SUNOS3.x
  614.         {
  615.           if (pscanf(PostScriptInput, "%d", &type) == EOF) exit(1) ;
  616.           switch (type)
  617.             {
  618.               case DIED     : exit(0) ;
  619.               case PAINTED  : if (psrecs != NULL) do_news_ps(psrecs) ;
  620.             }
  621.         }
  622.       else
  623.         {
  624.           this = psrecs ;     /* Point to beginning of NeWS records. */
  625.           if (mtype != MONNEW)
  626.             {
  627.               while (this != NULL)
  628.                 {
  629.                   next = this->next ;
  630.                   if (this->name != NULL) free(this->name) ;
  631.                   free((char *) this) ;   /* Remove this record. */
  632.                   this = next ;
  633.                 }
  634.               psrecs = plast = NULL ;
  635.             }
  636.           do_check() ;        /* Check the mail/printer again. */
  637.         }
  638.     }
  639. }
  640.  
  641.  
  642. text(display,just,str)
  643. enum disp_type display ;
  644. enum just_type just ;
  645. char *str ;
  646. {
  647.   int i, len ;
  648.   int c, r ;             /* Column and row position for this face. */
  649.   int x, y ;             /* Position of start of this text string. */
  650.   char line[MAXLINE] ;   /* PostScript text string to be builtup. */
  651.   char tpr ;             /* Indicator for destination offscreen canvas. */
  652.  
  653.   c = column ;
  654.   r = row ;
  655.   switch ((int) display)
  656.     {
  657.       case BOTH   : text(ICON, just, str) ;
  658.                     text(WINDOW, just, str) ;
  659.                     return ;
  660.       case ICON   : tpr = 'M' ;       /* MPR canvas. */
  661.                     if (mtype != MONALL) c = r = 0 ;
  662.                     break ;
  663.       case WINDOW : tpr = ' ' ;       /*  PR canvas. */
  664.     }
  665.  
  666.   len = strlen(str) ;         /* Character length of text. */
  667.   if (len > 10)
  668.     {
  669.       len = 10 ;
  670.       str[10] = '\0' ;   /* Maximum of 10 characters. */
  671.     }
  672.  
  673.   line[0] = '\0' ;
  674.   for (i = 0; i < len; i++)
  675.     switch (str[i])
  676.       {
  677.         case '\\' : STRCAT(line,"\\\\") ;
  678.                     break ;
  679.         case '('  : STRCAT(line,"\\(") ;
  680.                     break ;
  681.         case ')'  : STRCAT(line,"\\)") ;
  682.                     break ;
  683.         default   : STRNCAT(line,&str[i],1) ;
  684.       }
  685.  
  686.   switch ((int) just)
  687.     {
  688.       case LEFT  : x = c*ICONWIDTH+2 ;
  689.                    y = r*ICONHEIGHT+2 ;
  690.                    break ;
  691.       case RIGHT : x = (c+1)*ICONWIDTH-(len*6)-2 ;
  692.                    y = r*ICONHEIGHT+2 ;
  693.     }
  694.   FPRINTF(PostScript,"%d %d %d %d %cPR ClearBox\n", x, y, len*6+2, 10, tpr) ;
  695.   FPRINTF(PostScript,"(%s) %d %d %cPR MakeText\n", line, x, y, tpr) ;
  696. }
  697. Funky_Stuff
  698. len=`wc -c < news.c`
  699. if [ $len !=    10648 ] ; then
  700. echo error: news.c was $len bytes long, should have been    10648
  701. fi
  702. fi # end of overwriting check
  703. if [ -f rec.c ]
  704. then
  705. echo shar: will not over-write existing file rec.c
  706. else
  707. echo shar: extracting 'rec.c',     6808 characters
  708. cat > rec.c <<'Funky_Stuff'
  709. /*LINTLIBRARY*/
  710. #ifndef lint
  711. static char sccsid[] = "@(#)rec.c 1.2 88/12/09" ;
  712. #endif
  713.  
  714. /*  Record handling routines used by the faces program.
  715.  * 
  716.  *  Copyright (c) Rich Burridge - Sun Microsystems Australia.
  717.  *                                All rights reserved.
  718.  *
  719.  *  Permission is given to distribute these sources, as long as the
  720.  *  copyright messages are not removed, and no monies are exchanged. 
  721.  * 
  722.  *  No responsibility is taken for any errors on inaccuracies inherent
  723.  *  either to the comments or the code of this program, but if reported
  724.  *  to me, then an attempt will be made to fix them.
  725.  */
  726.  
  727. #include "faces.h"
  728. #include "extern.h"
  729.  
  730. char *
  731. Malloc(n)
  732. int n ;
  733. {
  734.   char *val ;
  735.  
  736.   if ((val = malloc((unsigned) n)) == NULL)
  737.     FPRINTF(stderr,"%s: Out of memory.\n",progname) ;
  738.   return val ;
  739. }
  740.  
  741.  
  742. add_alias(crec, username, alias)  /* Add new alias to hostnames' list. */
  743. struct comminfo *crec ;
  744. char *username, *alias ;
  745. {
  746.   struct peopinfo *cptemp, *ptemp ;
  747.  
  748.   ptemp = (struct peopinfo *) Malloc(sizeof(struct peopinfo)) ;
  749.   ptemp->alias = (char *) Malloc(strlen(alias)) ;
  750.   STRCPY(ptemp->alias, alias) ;
  751.   ptemp->username = (char *) Malloc(strlen(username)) ;
  752.   STRCPY(ptemp->username, username) ;
  753.   ptemp->next = NULL ;
  754.  
  755.   if (crec->people == NULL) crec->people = ptemp ;
  756.   else
  757.     {
  758.       cptemp = crec->people ;
  759.       while (cptemp != NULL)
  760.         if (cptemp->next == NULL)
  761.           {
  762.             cptemp->next = ptemp ;
  763.             return ;
  764.           }
  765.         else cptemp = cptemp->next ;
  766.     }
  767. }
  768.  
  769.  
  770. add_machine(machine, community)    /* Add new machine to list. */
  771. char *machine, *community ;
  772. {
  773.   struct machinfo *temp ;
  774.  
  775.   temp = (struct machinfo *) Malloc(sizeof(struct machinfo)) ;
  776.   temp->machine = (char *) Malloc(strlen(machine)) ;
  777.   STRCPY(temp->machine, machine) ;
  778.   temp->community = (char *) Malloc(strlen(community)) ;
  779.   STRCPY(temp->community, community) ;
  780.   temp->next = NULL ;
  781.  
  782.   if (machines == NULL) machines = mlast = temp ;   /* Start chain. */
  783.   else if (mlast != NULL)
  784.     {
  785.       mlast->next = temp ;     /* Add record to existing chain. */
  786.       mlast = temp ;           /* Point to end of chain. */
  787.     }
  788. }
  789.  
  790.  
  791. add_ps_rec(row, column, name)  /* Add record for later animation. */
  792. int row, column ;
  793. char *name ;
  794. {
  795.   struct psinfo *temp ;
  796.  
  797.   temp = (struct psinfo *) Malloc(sizeof(struct psinfo)) ;
  798.   temp->name = (char *) Malloc(strlen(name)) ;
  799.   STRCPY(temp->name, name) ;
  800.   temp->row = row ;
  801.   temp->column = column ;
  802.   temp->next = NULL ;
  803.  
  804.   if (psrecs == NULL) psrecs = plast = temp ;    /* Start chain. */
  805.   else if (plast != NULL)
  806.     {
  807.       plast->next = temp ;     /* Add record to existing chain. */
  808.       plast = temp ;
  809.     }
  810. }
  811.  
  812.  
  813. add_record(community, username, timestamp, size)
  814. char *community, *username, *timestamp ;
  815. int size ;
  816. {
  817.   struct recinfo *temp ;
  818.  
  819.   temp = (struct recinfo *) Malloc(sizeof(struct recinfo)) ;
  820.   temp->community = (char *) Malloc(strlen(community)) ;
  821.   STRCPY(temp->community, community) ;
  822.   temp->username = (char *) Malloc(strlen(username)) ;
  823.   STRCPY(temp->username, username) ;
  824.   temp->iconname = (char *) Malloc(strlen(iconname)) ;
  825.   STRCPY(temp->iconname, iconname) ;
  826.   STRCPY(temp->ts, timestamp) ;
  827.   temp->size = size ;
  828.   temp->total = 1 ;
  829.   temp->next = NULL ;
  830.   noicons++ ;
  831.   if (recs == NULL) recs = last = temp ;        /* Start chain. */
  832.   else
  833.     {
  834.       last->next = temp ;  /* Add record to existing chain. */
  835.       last = temp ;        /* Point to the end of the chain. */
  836.     }
  837. }
  838.  
  839.  
  840. check_comm(hostname, username, alias)  /* Check community list. */
  841. char *hostname, *username, *alias ;
  842. {
  843.   struct comminfo *ctemp ;
  844.  
  845.   ctemp = communities ;      /* Try and find machine record for hostname. */
  846.   while (ctemp != NULL)
  847.     if (EQUAL(ctemp->community, hostname))
  848.       {  
  849.         add_alias(ctemp, username, alias) ;
  850.         return ;
  851.       }  
  852.     else ctemp = ctemp->next ;
  853.  
  854.   ctemp = (struct comminfo *) Malloc(sizeof(struct comminfo)) ;
  855.   ctemp->community = (char *) Malloc(strlen(hostname)) ;
  856.   STRCPY(ctemp->community, hostname) ; 
  857.   ctemp->people = NULL ; 
  858.   ctemp->next = NULL ; 
  859.  
  860.   if (communities == NULL) communities = clast = ctemp ;  /* Start chain. */ 
  861.   else 
  862.     { 
  863.       clast->next = ctemp ;   /* Add record to existing chain. */
  864.       clast = ctemp ;         /* Point to end of chain. */
  865.     }
  866.   add_alias(ctemp, username, alias) ;
  867. }
  868.  
  869.  
  870. read_aliases()     /* Setup the hostname aliases subchains. */
  871. {
  872.   char alias[MAXLINE] ;      /* Alias for this community/username. */
  873.   char hostname[MAXLINE] ;   /* This records' hostname. */
  874.   char username[MAXLINE] ;   /* This records real username. */
  875.   char *ptr1, *ptr2 ;
  876.   FILE *fd ;
  877.  
  878.   if ((fd = fopen(peopfile, "r")) == NULL)   /* Open people file. */
  879.     {
  880.       FPRINTF(stderr,"%s: cannot open %s\n", progname, peopfile) ;
  881.       return ;
  882.     }
  883.   while (fgets(nextline, MAXLINE, fd) != NULL)
  884.     {
  885.       ptr1 = index(nextline, '/') ;
  886.       STRNCPY(hostname, nextline, (int) (ptr1-nextline)) ;
  887.       hostname[(int) (ptr1-nextline)] = '\0' ;
  888.       ptr2 = index(nextline, '=') ;
  889.       STRNCPY(alias, ptr1+1, (int) (ptr2-ptr1-1)) ;
  890.       alias[(int) (ptr2-ptr1-1)] = '\0' ;
  891.       STRNCPY(username, ptr2+1, strlen(ptr2)-2) ;
  892.       username[strlen(ptr2)-2] = '\0' ;
  893.       check_comm(hostname, username, alias) ;
  894.     }
  895.   FCLOSE(fd) ;
  896. }
  897.  
  898.  
  899. read_machines()       /* Setup the chain of machine/community records. */
  900. {
  901.   char community[MAXLINE] ;   /* This records' community. */
  902.   char machine[MAXLINE] ;     /* This records' machine name. */
  903.   char *ptr ;
  904.   FILE *fd ;
  905.  
  906.   if ((fd = fopen(machfile, "r")) == NULL)   /* Open machine file. */
  907.     {
  908.       FPRINTF(stderr,"%s: cannot open %s\n", progname, machfile) ;
  909.       return ;
  910.     }
  911.   while (fgets(nextline, MAXLINE, fd) != NULL)
  912.     {
  913.       ptr = index(nextline, '=') ;
  914.       STRNCPY(machine, nextline, (int) (ptr-nextline)) ;
  915.       machine[(int) (ptr-nextline)] = '\0' ;
  916.       STRNCPY(community, ptr+1, strlen(ptr)-2) ;
  917.       community[strlen(ptr)-2] = '\0' ;
  918.       add_machine(machine, community) ;
  919.     }
  920.   FCLOSE(fd) ;
  921. }
  922.  
  923.  
  924. struct recinfo *
  925. rec_exists(community,username)    /* Check if record exists for mail item. */
  926. char *community, *username ;
  927. {
  928.   struct recinfo *temp ;     /* Pointer to mail records used for chaining. */
  929.  
  930.   temp = recs ;
  931.   while (temp != NULL)
  932.     {
  933.       if (EQUAL(temp->username, username) &&
  934.           EQUAL(temp->community, community))
  935.         return(temp) ;       /* Record found. */
  936.       temp = temp->next ;    /* Point to next record. */
  937.     }
  938.   return(NULL) ;
  939. }
  940.  
  941.  
  942. remove_record(thisrec)        /* Remove this record from the chain. */
  943. struct recinfo *thisrec ;
  944. {
  945.   if (thisrec->community != NULL) free(thisrec->community) ;
  946.   if (thisrec->username != NULL) free(thisrec->username) ;
  947.   if (thisrec->iconname != NULL) free(thisrec->iconname) ;
  948.   free((char *) thisrec) ;
  949. }
  950. Funky_Stuff
  951. len=`wc -c < rec.c`
  952. if [ $len !=     6808 ] ; then
  953. echo error: rec.c was $len bytes long, should have been     6808
  954. fi
  955. fi # end of overwriting check
  956. if [ -f sunview.c ]
  957. then
  958. echo shar: will not over-write existing file sunview.c
  959. else
  960. echo shar: extracting 'sunview.c',     9881 characters
  961. cat > sunview.c <<'Funky_Stuff'
  962. /*LINTLIBRARY*/
  963. #ifndef lint
  964. static char sccsid[] = "@(#)sunview.c 1.1 88/12/04" ;
  965. #endif
  966.  
  967. /*  SunView dependent graphics routines used by faces,
  968.  *  the visual mail and print job monitor.
  969.  * 
  970.  *  Copyright (c) Rich Burridge - Sun Microsystems Australia.
  971.  *                                All rights reserved.
  972.  *
  973.  *  Permission is given to distribute these sources, as long as the
  974.  *  copyright messages are not removed, and no monies are exchanged. 
  975.  * 
  976.  *  No responsibility is taken for any errors or inaccuracies inherent
  977.  *  either to the comments or the code of this program, but if reported
  978.  *  to me, then an attempt will be made to fix them.
  979.  */
  980.  
  981. #include "faces.h"
  982. #include "extern.h"
  983. #include <stdio.h>
  984. #include <suntool/sunview.h>
  985. #include <suntool/canvas.h>
  986.  
  987. #define  ICON_SET                (void) icon_set
  988. #define  NOTIFY_SET_ITIMER_FUNC  (void) notify_set_itimer_func
  989. #define  PR_DESTROY              (void) pr_destroy
  990. #define  PR_REPLROP              (void) pr_replrop
  991. #define  PR_ROP                  (void) pr_rop
  992.  
  993. #ifdef SUNOS3.x
  994. #define  PR_TTEXT                (void) pf_ttext
  995. #else
  996. #define  PR_TTEXT                (void) pr_ttext
  997. #endif SUNOS3.x
  998.  
  999. #define  PW_ROP                  (void) pw_rop
  1000. #define  WIN_BELL                (void) win_bell
  1001. #define  WINDOW_SET              (void) window_set
  1002.  
  1003. #define  SMALLFONT    "/usr/lib/fonts/fixedwidthfonts/screen.r.7"
  1004. #define  ITIMER_NULL  ((struct itimerval *) 0)
  1005.  
  1006. int repaint_proc() ;
  1007.  
  1008. Canvas canvas ;
  1009. Frame frame ;
  1010. Icon faces_icon ;
  1011. Pixfont *sfont ;              /* Small font for timestamp and count. */
  1012. Pixrect *mpr, *pr ;           /* Pointers to current pixrects. */
  1013. Pixrect *old_mpr, *old_pr ;   /* Pointers to previous pixrects. */
  1014. Pixrect *background ;         /* Pointer to background pattern or gray. */
  1015. Pixwin *fpw, *pw ;
  1016. Rect *temprect ;
  1017. int ffd ;                     /* File descriptor of faces frame. */
  1018.  
  1019. short gray_image[] = { 0x8000, 0x8000, 0x2000, 0x2000 } ;
  1020. mpr_static(gray_pr, 4, 4, 1, gray_image) ;
  1021.  
  1022. short noface_image[] = {
  1023. #include "noface.icon"
  1024. } ;
  1025. mpr_static(noface_pr, 64, 64, 1, noface_image) ;
  1026.  
  1027. short nomail_image[] = {
  1028. #include "nomail.icon"
  1029. } ;
  1030. mpr_static(nomail_pr, 64, 64, 1, nomail_image) ;
  1031.  
  1032. short nopaper_image[] = {
  1033. #include "nopaper.icon"
  1034. } ;
  1035. mpr_static(nopaper_pr, 64, 64, 1, nopaper_image) ;
  1036.  
  1037. short noprint_image[] = {
  1038. #include "noprint.icon"
  1039. } ;
  1040. mpr_static(noprint_pr, 64, 64, 1, noprint_image) ;
  1041.  
  1042.  
  1043. add_face(display, itype, name)
  1044. enum disp_type display ;
  1045. enum icon_type itype ;
  1046. char *name ;
  1047. {
  1048.   Pixrect *face_pr ;
  1049.   unsigned short buf[256] ;  /* Ikon/icon image. */
  1050.   unsigned short *ptr ;
  1051.   int freeit ;               /* Set if we should destroy this pixrect. */
  1052.   int i ;
  1053.  
  1054.   freeit = 0 ;
  1055.   switch ((int) itype)
  1056.     {
  1057.       case NOMAIL   : face_pr = &nomail_pr ;
  1058.                       break ;
  1059.       case NOPAPER  : face_pr = &nopaper_pr ;
  1060.                       break ;
  1061.       case NOPRINT  : face_pr = &noprint_pr ;
  1062.                       break ;
  1063.       case ORDINARY : if (get_icon(name, buf) == -1) face_pr = &noface_pr ;
  1064.                       else
  1065.                         {
  1066.                           face_pr = mem_create(64, 64, 1) ;
  1067.                           ptr = (unsigned short *)
  1068.                                 ((struct mpr_data *) face_pr->pr_data)->md_image ;
  1069.                           for (i = 0; i < 256; i++) ptr[i] = buf[i] ;
  1070.                           freeit = 1 ;
  1071.                         }
  1072.                       break ;
  1073.     }
  1074.   if (display == ICON)
  1075.     if (mtype == MONPRINTER) adjust_image(mpr, face_pr, 0, 0) ;
  1076.     else adjust_image(mpr, face_pr, row, column) ;
  1077.   else if (display == WINDOW) adjust_image(pr, face_pr, row, column) ;
  1078.   else
  1079.     {
  1080.       adjust_image(mpr, face_pr, row, column) ;
  1081.       adjust_image(pr, face_pr, row, column) ;
  1082.     }
  1083.   if (freeit) PR_DESTROY(face_pr) ;
  1084. }
  1085.  
  1086.  
  1087. adjust_image(fpr, face_pr, row, column)    /* Place new face in memory pixrect. */
  1088. Pixrect *fpr, *face_pr ;
  1089. int row, column ;
  1090. {
  1091.   switch ((int) mtype)
  1092.     {
  1093.       case MONNEW     : PR_ROP(fpr, 64, 0, 640-64, 64, PIX_SRC, fpr, 0, 0) ;
  1094.       case MONALL     :
  1095.       case MONPRINTER : PR_ROP(fpr, column*ICONWIDTH, row*ICONHEIGHT,
  1096.                                ICONWIDTH, ICONHEIGHT, PIX_SRC, face_pr, 0, 0) ;
  1097.     }
  1098. }
  1099.  
  1100.  
  1101. Notify_value
  1102. check_mail()
  1103. {
  1104.   do_check() ;
  1105. }
  1106.  
  1107.  
  1108. beep_flash(beeps, flashes)    /* Perform visual feedback. */
  1109. int beeps, flashes ;
  1110. {
  1111.   static struct timeval btime = { 0, 250000 } ;   /* Beep timer. */
  1112.   int bfd ;        /* File descriptor for faces window, or -1. */
  1113.   Pixwin *bpw ;    /* Pixwin pointer for faces window, or 0. */
  1114.  
  1115.   if (beeps || flashes)
  1116.     do
  1117.       {
  1118.         bfd = beeps > 0 ? ffd : -1 ;
  1119.         bpw = flashes > 0 ? fpw : (Pixwin *) 0 ;
  1120.         WIN_BELL(bfd, btime, bpw) ;
  1121.         SELECT(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &btime) ;
  1122.         beeps-- ;
  1123.         flashes-- ;
  1124.       } 
  1125.     while (beeps > 0) ;
  1126. }
  1127.  
  1128.  
  1129. create_pixrects(width, height)   /* Create pixrects for the face images. */
  1130. int width, height ;
  1131. {
  1132.   old_pr = pr ;
  1133.   pr = mem_create(width, height, 1) ;
  1134.   PR_REPLROP(pr, 0, 0, width, height, PIX_SRC, background, 0, 0) ;
  1135.   faces_icon = (Icon) window_get(frame, FRAME_ICON) ;
  1136.   old_mpr = (Pixrect *) icon_get(faces_icon, ICON_IMAGE) ;
  1137.   if (mtype == MONPRINTER) mpr = mem_create(ICONWIDTH, ICONHEIGHT, 1) ;
  1138.   else
  1139.     {
  1140.       mpr = mem_create(width, height, 1) ;
  1141.       PR_REPLROP(mpr, 0, 0, width, height, PIX_SRC, background, 0, 0) ;
  1142.     }
  1143.   if (mtype == MONNEW && old_pr != NULL)
  1144.     PR_ROP(pr, 0, 0, width, height, PIX_SRC, old_pr, 0, 0) ;
  1145.   if (mtype == MONNEW && old_mpr != NULL)
  1146.     PR_ROP(mpr, 0, 0, width, height, PIX_SRC, old_mpr, 0, 0) ;
  1147. }
  1148.  
  1149.  
  1150. init_ws_type()
  1151. {
  1152.   gtype = SUNVIEW ;
  1153.   return 0 ;
  1154. }
  1155.  
  1156.  
  1157. make_frame(argc,argv)
  1158. int argc ;
  1159. char *argv[] ;
  1160. {
  1161.   unsigned short buf[256] ;  /* For background pattern. */
  1162.   unsigned short *ptr ;
  1163.   int i ;
  1164.  
  1165.   if (strlen(bgicon))
  1166.     {
  1167.       if (get_sun_icon(bgicon, buf) == 0) background = &gray_pr ;
  1168.       background = mem_create(64, 64, 1) ;
  1169.       ptr = (unsigned short *)
  1170.             ((struct mpr_data *) background->pr_data)->md_image ;
  1171.       for (i = 0; i < 256; i++) ptr[i] = buf[i] ;
  1172.     }
  1173.   else background = &gray_pr ;
  1174.  
  1175.   frame = window_create((Window) 0, FRAME,
  1176.                         FRAME_ICON, faces_icon,
  1177.                         FRAME_SHOW_LABEL, FALSE,
  1178.                         FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
  1179.                         FRAME_NO_CONFIRM, TRUE,
  1180.                         WIN_WIDTH, NO_PER_ROW * ICONWIDTH + 10,
  1181.                         WIN_HEIGHT, ICONHEIGHT * 10 + 10,
  1182.                         FRAME_ARGS, argc,argv,
  1183.                         0) ;
  1184.   fpw = (Pixwin *) window_get(frame, WIN_PIXWIN) ;
  1185.   ffd = (int) window_get(frame, WIN_FD) ;
  1186.  
  1187.   canvas = window_create(frame, CANVAS,
  1188.                          CANVAS_REPAINT_PROC, repaint_proc,
  1189.                          CANVAS_RETAINED, TRUE,
  1190.                          0) ;
  1191.   pw = canvas_pixwin(canvas) ;
  1192.   sfont = pf_open(SMALLFONT) ;
  1193.   width = NO_PER_ROW * ICONWIDTH ;
  1194.   height = ICONHEIGHT ;
  1195. }
  1196.  
  1197.  
  1198. make_icon()
  1199. {
  1200.   if (mtype == MONPRINTER)
  1201.     faces_icon = icon_create(ICON_IMAGE, &noprint_pr, 0) ;
  1202.   else faces_icon = icon_create(ICON_IMAGE, &nomail_pr, 0) ;
  1203. }
  1204.  
  1205.  
  1206. /*ARGSUSED*/
  1207. repaint_proc(canvas, pw, repaint_area)
  1208. Canvas canvas ;
  1209. Pixwin *pw ;
  1210. Rectlist *repaint_area ;
  1211. {
  1212.   PW_ROP(pw, 0, 0, width, height, PIX_SRC, pr, 0, 0) ;
  1213. }
  1214.  
  1215.  
  1216. show_display()    /* Show the latest set of mail icon faces. */
  1217. {
  1218.   if (invert)     /* Invert the memory pixrects before displaying. */
  1219.     {
  1220.       PR_ROP(pr, 0, 0, width, height, PIX_NOT(PIX_DST), pr, 0, 0) ;
  1221.       PR_ROP(mpr, 0, 0, width, height, PIX_NOT(PIX_DST), pr, 0, 0) ;
  1222.     }
  1223.  
  1224.   if (mtype != MONPRINTER)
  1225.     {
  1226.       temprect = (Rect *) icon_get(faces_icon, ICON_IMAGE_RECT) ;
  1227.       temprect->r_height = height ;
  1228.       temprect->r_width = width ;
  1229.       ICON_SET(faces_icon, ICON_HEIGHT, height,
  1230.                            ICON_WIDTH, width,
  1231.                            ICON_IMAGE_RECT, temprect,
  1232.                            ICON_IMAGE, mpr,
  1233.                            0) ;
  1234.     }
  1235.   else ICON_SET(faces_icon, ICON_IMAGE, mpr, 0) ;
  1236.   WINDOW_SET(frame, FRAME_ICON, faces_icon, 0) ;
  1237.  
  1238.   temprect = (Rect *) window_get(frame, FRAME_OPEN_RECT) ;
  1239.   temprect->r_height = height+10 ;
  1240.   temprect->r_width = width+10 ;
  1241.   WINDOW_SET(frame, FRAME_OPEN_RECT, temprect, 0) ;
  1242.   PW_ROP(pw, 0, 0, width, height, PIX_SRC, pr, 0, 0) ;
  1243.  
  1244.   if (newmail) beep_flash(beeps, flashes) ;
  1245.   if (old_pr) PR_DESTROY(old_pr) ;
  1246.   if (old_mpr) PR_DESTROY(old_mpr) ;
  1247. }
  1248.  
  1249.  
  1250. start_tool()
  1251. {
  1252.   struct itimerval tval ;
  1253.  
  1254.   tval.it_interval.tv_usec = 0 ;
  1255.   tval.it_interval.tv_sec = period ;
  1256.   tval.it_value.tv_usec = 0 ;
  1257.   tval.it_value.tv_sec = period ;
  1258.   NOTIFY_SET_ITIMER_FUNC(frame, check_mail,
  1259.                          ITIMER_REAL, &tval, ITIMER_NULL) ;
  1260.   window_main_loop(frame) ;
  1261. }
  1262.  
  1263.  
  1264. text(display, just, str)
  1265. enum disp_type display ;
  1266. enum just_type just ;
  1267. char *str ;
  1268. {
  1269.   int len ;
  1270.   int c, r ;         /* Column and row position for this face. */
  1271.   int x, y ;         /* Position of start of this text string. */
  1272.   Pixrect *tpr ;
  1273.  
  1274.   c = column ;
  1275.   r = row ;
  1276.   switch ((int) display)
  1277.     {
  1278.       case BOTH   : text(ICON, just, str) ;
  1279.                     text(WINDOW, just, str) ;
  1280.                     return ;
  1281.       case ICON   : tpr = mpr ;
  1282.                     if (mtype != MONALL) c = r = 0 ;
  1283.                     break ;
  1284.       case WINDOW : tpr = pr ;
  1285.     }
  1286.  
  1287.   len = strlen(str) ;              /* Character length of text. */
  1288.   if (len > 10)
  1289.     {
  1290.       len = 10 ;
  1291.       str[10] = '\0' ;   /* Maximum of 10 characters. */
  1292.     }
  1293.   switch ((int) just)
  1294.     {
  1295.       case LEFT  : x = c*ICONWIDTH+2 ;
  1296.                    y = (r+1)*ICONHEIGHT-2 ;
  1297.                    break ;
  1298.       case RIGHT : x = (c+1)*ICONWIDTH-(len*6)-2 ;
  1299.                    y = (r+1)*ICONHEIGHT-2 ;
  1300.     }
  1301.   PR_ROP(tpr, x, y-9, len*6+2, 10, PIX_CLR, (Pixrect *) NULL, 0, 0) ;
  1302.   PR_TTEXT(tpr, x, y, PIX_SRC ^ PIX_NOT(PIX_DST), sfont, str) ;
  1303. }
  1304. Funky_Stuff
  1305. len=`wc -c < sunview.c`
  1306. if [ $len !=     9881 ] ; then
  1307. echo error: sunview.c was $len bytes long, should have been     9881
  1308. fi
  1309. fi # end of overwriting check
  1310.